﻿#region << 文件说明 >>

/*----------------------------------------------------------------
 * 命名空间：Vampirewal.BlogCore.Controls.Container
 * 唯一标识：d2512513-7e1f-4dd6-b3e1-49549a7406c3
 * 文件名：Table
 *
 * 创建者：杨程
 * 电子邮箱：235160615@qq.com
 * 创建时间：2024/6/26 20:41:54
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/

#endregion << 文件说明 >>

namespace Vampirewal.BlogCore;

public static partial class App
{
    /// <summary>
    /// 创建表格
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data"></param>
    /// <returns></returns>
    /// <exception cref="ArgumentException"></exception>
    public static Table CreateTable<T>(List<T> data) where T : class 
    {
        var type = typeof(T);

        var tableAttr = type.GetCustomAttribute<TableAttribute>();

        if (tableAttr == null)
            throw new ArgumentException("该模型没有标记TableAttribute特性!");

        Table tb2 = new Table()
        {
            TableHeaders = new List<string>(),
            TableValues = new List<string>(),
        };

        var Props = type.GetProperties().Where(w => w.GetCustomAttribute<TableItemAttribute>() != null);

        foreach (var item in Props)
        {
            var itemAttr = item.GetCustomAttribute<TableItemAttribute>()!;

            string elTableItem = $"<th style=\"border: 1px solid #ddd; padding: 12px; text-align: {itemAttr.TextAlign.GetDescription()}; background-color: {itemAttr.TitleBackgroundColor};\">{itemAttr.Label}</th>";

            tb2.TableHeaders.Add(elTableItem);
        }

        StringBuilder sb = new StringBuilder();

        foreach (var value in data)
        {
            foreach (var prop in Props)
            {
                var itemAttr = prop.GetCustomAttribute<TableItemAttribute>()!;

                var v = prop.GetValue(value);

                sb.AppendLine($"<td style=\"border: 1px solid #ddd; padding: 12px; text-align: {itemAttr.TextAlign.GetDescription()};\">{v}</td>");
            }

            tb2.TableValues.Add(sb.ToString());

            sb.Clear();
        }

        return tb2;
    }
}

/// <summary>
/// 表格控件
/// </summary>
public sealed class Table : ControlBase
{
    internal Table()
    {
    }

    public override string Id { get; set; }
    public override string Title { get; set; }

    public override string ConverToHtml()
    {
        StringBuilder sb = new StringBuilder();

        sb.AppendLine($"<table style=\"width: 100%; border-collapse: collapse; margin: 20px 0;\">");
        sb.AppendLine($"    <thead >");
        sb.AppendLine($"        <tr >");

        foreach (var item in TableHeaders)
        {
            sb.AppendLine(item);
        }
        sb.AppendLine($"        </tr >");
        sb.AppendLine($"    </thead >");

        sb.AppendLine($"    <tbody>");

        foreach (var item in TableValues)
        {
            sb.AppendLine($"        <tr>");
            sb.AppendLine(item);
            sb.AppendLine($"        </tr>");
        }

        sb.AppendLine($"    </tbody>");

        sb.AppendLine($"</table>");

        return sb.ToString();
    }

    /// <summary>
    /// 表格列头
    /// </summary>
    internal List<string> TableHeaders { get; set; }

    /// <summary>
    /// 表格值
    /// </summary>
    internal List<string> TableValues { get; set; }
}